//
//  AxImKitClient.h
//  AxImKit
//
//  Created by xuxinhua on 2020/2/6.
//  Copyright © 2020 xuxinhua. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "AxImKitCommonConstant.h"


@class AxImKitInitOptions;
@class AxImKitUser;
@class AxImKitToUser;
@class AxImKitMessage;
@class AxImKitGroup;
@class AxImKitEventResult;
@class AxImKitGroupResult;
@class AxImKitGroup;
@class AxImKitGroupMember;
@class AxImKitQueryHistoryParameter;
@class AxImKitUserState;
@class AxImKitGroupQuit;
@class AxImKitGroupAdmin;
@class AxImKitChatSession;
@class AxImKitChatMessage;
@class AxImKitQuerySessionParameter;
@class AxImKitQueryHistoryMessageParameter;
@class AxImKitGroupSystemNotification;
@class AxImKitFile;
@class AxImKitDownloadParameter;
/**
 初始化回调
 */
typedef void(^AxImKitInitBlock)(NSError *error, NSString *loginAccToken);
typedef void(^QueryHistoryMessageBlock)(NSError *error,NSArray<AxImKitMessage *> *messages);
/**
 群聊创建结果
 @params error 错误信息
 @params groupResult 群聊创建结果
 */
typedef void(^CreateGroupBlock)(NSError *error,AxImKitGroupResult *groupResult);
/**
 查询当前用户已经加入的群
 @params error 错误信息
 @params groups 群聊创建结果
 */
typedef void(^GetGroupListBlock)(NSError *error,NSArray<AxImKitGroup *> *groups);
/**
 查询当前群成员结果
 @params error 错误信息
 @params members 群聊成员
 */
typedef void(^GetMembersBlock)(NSError *error,NSArray<AxImKitGroup *> *members);
/**
 邀请用户加入群/主动加入群结果
 @params error 错误信息
 @params groupId 群聊id
 */
typedef void(^JoinGroupBlock)(NSError *error,NSString *groupId);
/**
管理员移除群成员结果
@params error 错误信息
@params groupId 群聊id
*/
typedef void(^DeleteGroupBlock)(NSError *error,NSString *groupId);
/**
用户退群结果
@params error 错误信息
@params groupId 群聊id
*/
typedef void(^QuitGroupBlock)(NSError *error,NSString *groupId);
/**
群主解散结果
@params error 错误信息
@params groupId 群聊id
*/
typedef void(^DisbandGroupBlock)(NSError *error,NSString *groupId);
/**
用户可加入群查询结果
@params error 错误信息
@params groups 群列表
*/
typedef void(^SearchGroupListBlock)(NSError *error,NSArray<AxImKitGroup *> *groups);
/**
 查询群详细信息
 @params error 错误信息
 @params group 群信息
 */
typedef void(^GetGroupDetailBlock)(NSError *error,AxImKitGroup *group);
/**
查询用户在线状态结果
@params error 错误信息
@params userState 状态信息
*/
typedef void(^QueryUserStateBlock)(NSError *error,AxImKitUserState *userState);
 /**
 修改群配置信息
 @params error 错误信息
 */
typedef void(^ChangeGroupInfoBlock)(NSError *error);


@protocol AxImKitClientMessageDelegate <NSObject>

@optional
/**
 消息发送成功
 @param message 消息对象
 */
-(void)onImKitSendMessageSuccess:(AxImKitMessage *)message;

/**
 消息发送失败
 @param message 消息对象
 */
-(void)onImKitSendMessageFail:(AxImKitMessage *)message withError:(NSError *)error;

/**
 接收到消息
 @param messageList 消息对象集合
*/
-(void)onImKitReceiveMessage:(NSArray<AxImKitMessage *> *) messageList;

/**
 接收到补发消息
 @param messageList 消息对象集合
*/
-(void)onImKitReceiveReissueMessage:(NSArray<AxImKitMessage *> *) messageList;


@end

@protocol AxImKitClientUserDelegate <NSObject>

@optional
/**
 强制下线
 @param forceOfflineAccId 被强制下线用户的accId
 */
-(void)onImKitForceOfflineWithAccId:(NSString *)forceOfflineAccId;

@end


@protocol AxImKitClientGroupDelegate <NSObject>

@optional
/**
 群创建通知成员消息
 */
-(void)onImKitGroupCreate:(AxImKitGroupSystemNotification *)notification;

/**
 群解散通知
 */
-(void)onImKitGroupDisband:(AxImKitGroupSystemNotification *)notification;

/**
用户加入群通知成员消息
*/
-(void)onImKitGroupJoin:(AxImKitGroupSystemNotification *)notification;

/**
用户加入群通知所有者消息
*/
-(void)onImKitGroupJoinAdmin:(AxImKitGroupSystemNotification *)notification;
/**
用户退群通知消息
*/
-(void)onImKitGroupQuit:(AxImKitGroupSystemNotification *)notification;
/**
用户退群通知所有者消息
*/
-(void)onImKitGroupQuitAdmin:(AxImKitGroupSystemNotification *)notification;

/**
 用户被踢通知消息
 */
-(void)onImKitGroupKick:(AxImKitGroupSystemNotification *)notification;

/**
群信息修改通知成员消息
*/
-(void)onImKitChangeGroupInfo:(AxImKitGroupSystemNotification *)notification;
@end


@protocol AxImKitClientOtherDelegate <NSObject>

@optional
/**
 其它错误通知
 */
-(void)onImKitOtherError:(id)parameter;
@end


@protocol AxImKitClientAudioDelegate <NSObject>

@optional
//录制音频完成
-(void)onImKitAudioRecorded:(NSString *)audioFilePath;

/**
 播放音频完成
 */
-(void)onImKitAudioRecordPlayed;

@end


@interface AxImKitClient : NSObject
/**
 消息代理
 */
@property (nonatomic,weak) id<AxImKitClientMessageDelegate> messageDelegate;
/**
 用户代理
 */
@property (nonatomic,weak) id<AxImKitClientUserDelegate> userDelegate;
/**
 其它代理
 */
@property (nonatomic,weak) id<AxImKitClientOtherDelegate> otherDelegate;
/**
 群组代理
 */
@property (nonatomic,weak) id<AxImKitClientGroupDelegate> groupDategate;
/**
 录音代理
 */
@property (nonatomic,weak) id<AxImKitClientAudioDelegate> recordAudioDelegate;

/**
 初始化AxImKitClient对象
 @params options  初始化imKit配置参数
 */
-(instancetype)initImKitWithOptions:(AxImKitInitOptions *)options;

/**
 初始化imKit环境
 @params user     当前用户信息
 @params block    初始化回调
 */
-(void)imKitInitWithUserInfo:(AxImKitUser *)user withBlock:(AxImKitInitBlock)block;



/**
 释放资源
 */
-(void)destroyImKit;

/**
 创建消息报文
 @params messageType 消息类型
 @params content 消息内容
 @params toUser 消息接收用户
 @params extend 消息扩展参数 json字符串
 @params quoteMessageSeq 引用消息序列
 @params atAccTokenArray @用户的acctoken数组
 @return 消息报文对象
 */
-(AxImKitMessage *)createMessageWithMessageType:(AxImKitMessageType)messageType
                                        content:(NSString *)content
                                         toUser:(AxImKitToUser *)toUser
                                         extend:(NSString *)extend
                                quoteMessageSeq:(NSString *)quoteMessageSeq
                                     atAccToken:(NSArray<NSString *> *)atAccTokenArray;
/**
 发送消息
 @params message 消息报文对象
 */
-(void)sendMessage:(AxImKitMessage *)message;
/**
 一条消息已读
 @params message 消息报文对象
 */
-(void)sendMessageRead:(AxImKitMessage *)message;

/**
 根据会话id和最后一条聊天时间批量已读
 @params sessionId 会话id
 @params dataLine 最后一条聊天时间
 */
-(void)sendMessageReadBySessionId:(NSString *)sessionId dataLine:(long)dataLine;

/**
 根据消息序列批量删除消息
 @params msgSeqs 消息序列数组
 */
-(BOOL)deleteMessages:(NSArray<NSString *> *)msgSeqs;

/**
 根据会话id批量删除会话与会话下的消息
 @params sessionIdArray 会话id数组
 */
-(BOOL)deleteSessionWithSessionIdArray:(NSArray<NSString *> *)sessionIdArray;

/**
 附件上传
 @params file 文件对象
 @params progressBlock 上传进度回调
 @params completionHandler 完成回调
 如果是图片上传完成会带上缩略图的thumbnailMd5，audio上传不会返回thumbnailMd5
 */
-(NSURLSessionDataTask *)uploadFormData:(AxImKitFile *)file
             progressBlock:(void(^)(NSProgress *uploadProgress))progressBlock
             completionHandler:(void(^)(NSError *error,NSString *fileCode,NSString *thumbnailMd5))completionHandler;
/**
 附件下载
 @params downloadParameter 下载参数对象
 @params progressBlock 下载进度回调
 @params completionHandler 完成回调
 */
-(NSURLSessionDownloadTask *)download:(AxImKitDownloadParameter *)downloadParameter
  progressBlock:(void (^)(NSProgress *progress))progressBlock
                    completionHandler:(void (^)(NSError *error, NSURL *filePath))completionHandler;

/**
 创建群
 @params groupName 群名称
 @params members 群成员列表
 @params groupConfig 群配置 json字符串
 @params block 结果回调
 */
-(void)createGroupWithGroupName:(NSString *)groupName
                    withMembers:(NSArray<NSString *> *)members
                withGroupConfig:(NSString *)groupConfig
                withResultBlock:(CreateGroupBlock)block;
/**
 查询当前用户加入的群
 */
-(void)getGroupListWithResultBlock:(GetGroupListBlock)block;
/**
 根据群号查询群成员
 */
-(void)getGroupMembers:(NSString *)groupId
       withResultBlock:(GetMembersBlock)block;
/**
 邀请用户加入群/主动加入群
 @params groupId 群id
 @params accIdList 用户accId列表
 @params block 加入结果
 */
-(void)joinGroupWithGroupId:(NSString *)groupId
              withAccIdList:(NSArray<NSString *> *)accIdList
            withResultBlock:(JoinGroupBlock)block;
/**
 管理员删除群成员
 @params groupId 群id
 @params removeAccIdList 需要移除用户accId列表
 @params block 移除结果
 */
-(void)deleteGroupMemberWithGroupId:(NSString *)groupId
                withRemoveAccIdList:(NSArray<NSString *> *)removeAccIdList
                    withResultBlock:(DeleteGroupBlock)block;
/**
 用户退群
 @params groupId 群id
 @params block 退出结果
 */
-(void)quitGroupWithGroupId:(NSString *)groupId
            withResultBlock:(QuitGroupBlock)block;
/**
 群主解散群
 @params groupId 群id
 @params block 解散结果
 */
-(void)disbandGroupWithGroupId:(NSString *)groupId
               withResultBlock:(DisbandGroupBlock)block;

/**
 通过群组Id或群组名查询当前用户可加入的群组列表
 @params groupInfo 群id/群组名 (群组名支持模糊)
 @params block 解散结果
 */
-(void)searchGroupListWithGroupInfo:(NSString *)groupInfo
                 withResultBlock:(SearchGroupListBlock)block;

/**
 获取群组详细信息
 */
-(void)getGroupDetailWithGroupId:(NSString *)groupId
                 withResultBlock:(GetGroupDetailBlock)block;

/**
 修改群组配置
 @params group 群信息
 @params block 修改结果
 */
-(void)changeGroupInfoWithGroup:(AxImKitGroup *)group
                withResultBlock:(ChangeGroupInfoBlock)block;
/**
 判断用户是否在线
 @params accId 用户accId
 @params block 结果回调
 */
-(void)queryUserStateWithAccId:(NSString *)accId
               withResultBlock:(QueryUserStateBlock)block;
/**
 查询会话列表(无分页)
 @params queryParameter 查询参数
 @return 会话列表
 */
-(NSArray<AxImKitChatSession *> *)querySessionList:(AxImKitQuerySessionParameter *)queryParameter;
/**
 查询某个会话下的历史消息(分页)
 @params queryParameter 查询参数
 @return 消息列表
 */
-(NSArray<AxImKitChatMessage *> *)queryHistoryMessageList:(AxImKitQueryHistoryMessageParameter *)queryParameter;
/**
 开始录制
 */
-(void)startAudio;
/**
 结束录制
 */
-(void)stopAudio;
/**
 获取画音量
 */
-(float)getAudioPower;
/**
 停止播放
 */
-(void)stopPlayAudio;
/**
 开始播放
 @params audioFilePath 音频文件路径(包含文件名称)
 */
-(void)playAudioWithFilePath:(NSString *)audioFilePath;
/**
 取消录制音频时删除本地音频文件
 @params filePath 音频文件路径(包含文件名称)
 */
-(void)removeAudioWithFilePath:(NSString *)filePath;
@end
